﻿using System;

namespace _4._16委托练习
{
    class Program
    {
        //如果我爸来了，每个人的反应
        /*妈妈：看儿子去
         *爸爸：这臭小子学的好不好
         *老师：肯定得跟他爸妈说说他最近的不好表现
         *朋友：他爸肯定不好惹吧
         *我;认真学习，并且判断爸爸说得学习好不好 如果好怎么办，如果不好怎么办
         */
        static void Main(string[] args)
        {
            var b = new baoan();
            var mama = new mama("陈妈妈");
            var baba = new baba("陈爸爸");
            var laoshi = new laoshi("陈老师");
            var pengyou = new pengyou("耀朋友");
            var wo = new wo("陈奕志");
            Console.WriteLine("我正在学习中，爸爸妈妈来了");
            b.Lai += mama.doo;
            b.Lai += baba.doo;
            b.Lai += baba.doo;
            b.Lai += baba.doo;
            b.Lai += baba.doo;
            b.Lai += laoshi.doo;
            b.Lai += pengyou.doo;
            b.Lai += wo.doo;
            b.Report(4);

        }
    }
    public delegate void 爸爸妈妈来了(string s, string xuexi);
    class person
    {
        public string name;
        public person(string name) => this.name = name;//简写方式  =>方法体
        public virtual void doo(string s, string xuexi)//do做什么什么事情！，使用虚方法方便写方法
        {

        }
    }
    class mama : person
    {
        public mama(string name) : base(name) { }

        public override void doo(string s, string xuexi)
        {
            Console.WriteLine($"这个{s}学习的好不好，不好揍死他");
            if (xuexi == "好")
            {
                Console.WriteLine("我儿子真棒");
            }
            else
            {
                Console.WriteLine("臭小子你老爸要打你了");
            }
        }
    }
    class baba : person
    {
        public baba(string name) : base(name) { }
        public override void doo(string s, string xuexi)
        {
            Console.WriteLine($"{s}你学习好不好啊");
            if (xuexi == "好")
            {
                Console.WriteLine("我儿子真乖");
            }
            else
            {
                Console.WriteLine("我默默的抽出了我的七匹狼腰带");
            }

        }

    }
    class laoshi : person
    {
        public laoshi(string name) : base(name) { }
        public override void doo(string s, string xuexi)
        {

            if (xuexi == "好")
            {
                Console.WriteLine($"呀，这不{s}家长吗！,你儿子学习很棒的哦");
            }
            else
            {
                Console.WriteLine("你儿子极其差劲");
            }

        }
    }
    class pengyou : person
    {
        public pengyou(string name) : base(name) { }
        public override void doo(string s, string xuexi)
        {
            if (xuexi == "好")
            {
                Console.WriteLine($"蜀黍好，我是{s}的朋友");
            }
            else
            {
                Console.WriteLine($"蜀黍我不认识{s}");
            }
        }
    }
    class wo : person
    {
        public wo(string name) : base(name) { }
        public override void doo(string s, string xuexi)
        {
            if (xuexi == "好")
            {
                Console.WriteLine($"看了一眼爸妈{s}又继续认真学习");
            }
            else
            {
                Console.WriteLine($"{s}看了一眼爸妈，直接跳窗逃跑");
            }
        }
    }
    class baoan
    {
        public 爸爸妈妈来了 lai;
        public 爸爸妈妈来了 Lai
        {
            get { return lai; }
            set
            {
            
                if(lai == null)
                {
                    lai += value;
                }
                else
                {
                    Delegate[] list = lai.GetInvocationList();//获取委托中的所有方法
                    //联合查询
                    //Array.Find，查询所有元素并返回
                    var str = Array.Find(list, v =>
                       {
                        //Merhod 方法，Target：目标 委托中所有的方法的名字必须是doo，并且委托的参数也要相同
                        var c = v.Method.Name == "doo" && v.Target == value.Target;
                           return c;
                       });
                    if(str == null)
                    {
                        lai += value;
                    }
                    else
                    {
                        Console.WriteLine($"{value.Target.GetType().Name}一直在声明{value.Method.Name}");
                        if(value.Target is baba babas)//is运算符如果目标方法是爸爸
                        {
                            Console.WriteLine($"{babas.name}我错了");
                        }
                       else if (value.Target is mama mamas)
                        {
                            Console.WriteLine($"{mamas.name}我再也不敢了");
                        }
                        else
                        {
                            Console.WriteLine("爱咋咋地");
                        }
                    }
                }



                        }
        }
        public void Report(int juli)
        {
            if (juli < 5)
            {
                Console.WriteLine("爸爸妈妈进来了！");
                lai?.Invoke("陈奕志", "好");
            }
            else
            {
                Console.WriteLine("还没来再等会");
            }
        }
    }
}
